﻿using System.Collections.Generic;
using Newtonsoft.Json.Linq;

namespace Hamster.K3Cloud.WebAPI.ServerExtend
{
    public class Defineds
    {
        public const string FSrcEntryID = "FSrcBillEntryID";    // 参数中源单明细内码Key
        public const string DefaultSuccessMsg = "星空系统单据处理成功";
        public const string DefaultPushSaveErrorMsg = " 星空系统单据处理失败，请检查后重新操作";
    }

    /// <summary>
    /// API返回结果对象
    /// </summary>
    public struct Result
    {
        public bool success;    // 请求执行状态，成功：true；失败：false；
        public string msg;      // 返回描述信息
        public JObject data;    // 请求返回的数据
    }

    /// <summary>
    /// API请求参数的结构体
    /// </summary>
    public struct Parameter
    {
        public string LocalFormId;          // 上游单据ID
        public string NextFormId;           // 下游单据ID
        public string RuleId;               // 单据转换规则
        public string NextQueryEntryKey;    // 下游单据查询明细属性字段
        public string NextEntryKey;         // 下游单据明细单据单据ID
        public string ActionName;           // 单据操作动作
        public bool IsAutoSubmitAndAudit;   // 是否自动审核
        public JObject Model;               // 具体参数
    }

    /// <summary>
    /// 删除接口请求参数
    /// </summary>
    public struct RequestDelete
    {
        public long CreateOrgId;    // 创建者组织内码，字符串类型（非必录）
        public JArray Numbers;      // 单据编码集合，数组类型，格式：[No1,No2,...]（使用编码时必录）
        public string Ids;          // 单据内码集合，字符串类型，格式："Id1,Id2,..."（使用内码时必录）
        public bool NetworkCtrl;    // 是否启用网控，布尔类型，默认false（非必录）
    }

    /// <summary>
    /// 暂存接口请求参数
    /// </summary>
    public struct RequestDraft
    {
        public JArray NeedUpDateFields;         // 需要更新的字段，数组类型，格式：[key1,key2,...] （非必录）注（更新单据体字段得加上单据体key
        public JArray NeedReturnFields;         // 需返回结果的字段集合，数组类型，格式：[key,entitykey.key,...]（非必录） 注（返回单据体字段格式：entitykey.key）
        public bool IsDeleteEntry;              // 是否删除已存在的分录，布尔类型，默认true（非必录）
        public string SubSystemId;              // 表单所在的子系统内码，字符串类型（非必录）
        public bool IsVerifyBaseDataField;      // 是否验证所有的基础资料有效性，布尔类，默认false（非必录）
        public bool IsEntryBatchFill;           // 是否批量填充分录，默认true（非必录）
        public bool ValidateFlag;               // 是否验证标志，布尔类型，默认true（非必录）
        public bool NumberSearch;               // 是否用编码搜索基础资料，布尔类型，默认true（非必录）
        public string InterationFlags;          // 交互标志集合，字符串类型，分号分隔，格式："flag1;flag2;..."（非必录） 例如（允许负库存标识：STK_InvCheckResult）
        public JObject Model;                   // 表单数据包，JSON类型（必录）
    }

    /// <summary>
    /// 查看接口请求参数
    /// </summary>
    public struct RequestParameterView
    {
        public long CreateOrgId;                // 创建者组织内码（非必录）
        public string Number;                   // 单据编码，字符串类型（使用编码时必录）
        public string Id;                       // 表单内码（使用内码时必录）
    }

    /// <summary>
    /// 保存接口请求参数
    /// </summary>
    public struct RequestSave
    {
        public JArray NeedUpDateFields;         // 需要更新的字段，数组类型，格式：[key1,key2,...] （非必录）注（更新单据体字段得加上单据体key
        public JArray NeedReturnFields;         // 需返回结果的字段集合，数组类型，格式：[key,entitykey.key,...]（非必录） 注（返回单据体字段格式：entitykey.key）
        public bool IsDeleteEntry;              // 是否删除已存在的分录，布尔类型，默认true（非必录）
        public string SubSystemId;              // 表单所在的子系统内码，字符串类型（非必录）
        public bool IsVerifyBaseDataField;      // 是否验证所有的基础资料有效性，布尔类，默认false（非必录）
        public bool IsEntryBatchFill;           // 是否批量填充分录，默认true（非必录）
        public bool ValidateFlag;               // 是否验证标志，布尔类型，默认true（非必录）
        public bool NumberSearch;               // 是否用编码搜索基础资料，布尔类型，默认true（非必录）
        public string InterationFlags;          // 交互标志集合，字符串类型，分号分隔，格式："flag1;flag2;..."（非必录） 例如（允许负库存标识：STK_InvCheckResult）
        public JObject Model;                   // 表单数据包，JSON类型（必录）
    }

    /// <summary>
    /// 提交接口请求参数
    /// </summary>
    public struct RequestSubmit
    {
        public long CreateOrgId;                // 创建者组织内码，字符串类型（非必录）
        public JArray Numbers;                  // 单据编码集合，数组类型，格式：[No1,No2,...]（使用编码时必录）
        public string Ids;                      // 单据内码集合，字符串类型，格式："Id1,Id2,..."（使用内码时必录）
        public long SelectedPostId;             // 工作流发起员工岗位内码，整型（非必录） 注（员工身兼多岗时不传参默认取第一个岗位）
        public bool NetworkCtrl;                // 是否启用网控，布尔类型，默认false（非必录）
    }

    /// <summary>
    /// 撤销接口请求参数
    /// 
    /// 注意：
    /// webapi的撤销(CancelAssign)在20210422发布的PT 146874补丁及其以后的补丁中包含
    /// 如果没有打这个补丁，或者在这个补丁版本之前的星空版本没有提供撤销接口。
    /// </summary>
    public struct RequestParameterCancelAssign
    {
        public long CreateOrgId;                // 创建者组织内码，字符串类型（非必录）
        public JArray Numbers;                  // 单据编码集合，数组类型，格式：[No1,No2,...]（使用编码时必录）
        public string Ids;                      // 单据内码集合，字符串类型，格式："Id1,Id2,..."（使用内码时必录）
        public bool NetworkCtrl;                // 是否启用网控，布尔类型，默认false（非必录）
    }

    /// <summary>
    /// 审核接口请求参数
    /// </summary>
    public struct RequestAudit
    {
        public long CreateOrgId;            // 创建者组织内码，字符串类型（非必录）
        public JArray Numbers;              // 单据编码集合，数组类型，格式：[No1,No2,...]（使用编码时必录）
        public string Ids;                  // 单据内码集合，字符串类型，格式："Id1,Id2,..."（使用内码时必录）
        public string InterationFlags;      // 交互标志集合，字符串类型，分号分隔，格式："flag1;flag2;..."（非必录） 例如（允许负库存标识：STK_InvCheckResult）
        public bool NetworkCtrl;            // 是否启用网控，布尔类型，默认false（非必录）
    }

    /// <summary>
    /// 反审核接口请求参数
    /// </summary>
    public struct RequestUnAudit
    {
        public long CreateOrgId;       // 创建者组织内码，字符串类型（非必录）
        public JArray Numbers;          // 单据编码集合，数组类型，格式：[No1,No2,...]（使用编码时必录）
        public string Ids;              // 单据内码集合，字符串类型，格式："Id1,Id2,..."（使用内码时必录）
        public string InterationFlags;  // 交互标志集合，字符串类型，分号分隔，格式："flag1;flag2;..."（非必录） 例如（允许负库存标识：STK_InvCheckResult）
        public bool NetworkCtrl;        // 是否启用网控，布尔类型，默认false（非必录）
    }

    /// <summary>
    /// 下推接口请求参数
    /// </summary>
    public struct RequestPush
    {
        public string Ids;                  // 单据内码集合，字符串类型，格式："Id1,Id2,..."（使用内码时必录）
        public JArray Numbers;              // 单据编码集合，数组类型，格式：[No1,No2,...]（使用编码时必录）
        public string EntryIds;             // 分录内码集合，逗号分隔（分录下推时必录） 注（按分录下推时，单据内码和编码不需要填,否则按整单下推）
        public string RuleId;               // 转换规则内码，字符串类型（未启用默认转换规则时，则必录）
        public string TargetBillTypeId;     // 目标单据类型内码，字符串类型（非必录）
        public long TargetOrgId;            // 目标组织内码，整型（非必录）
        public string TargetFormId;         // 目标单据FormId，字符串类型，（启用默认转换规则时，则必录）
        public bool IsEnableDefaultRule;    // 是否启用默认转换规则，布尔类型，默认false（非必录
        public bool IsDraftWhenSaveFail;    // 保存失败时是否暂存，布尔类型，默认false（非必录） 注（暂存的单据是没有编码的）
        public JObject CustomParams;        // 自定义参数，字典类型，格式："{key1:value1,key2:value2,...}"（非必录） 注（传到转换插件的操作选项中，平台不会解析里面的值）
    }

    /// <summary>
    /// 单据数据查询接口
    /// </summary>
    public struct RequestQuery
    {
        public string FormId;           // 业务对象表单Id
        public string FieldKeys;        // 需查询的字段key集合，字符串类型，格式：'key1, key2, ...（必录） 注（查询单据体内码,需加单据体Key和下划线,如：FEntryKey_FEntryId）
        public string FilterString;     // 过滤条件（非必录）
        public string OrderString;      // 排序字段（非必录）
        public long TopRowCount;        // 返回总行数，整型（非必录）
        public long StartRow;           // 开始行索引，整型（非必录）
        public long Limit;              // 最大行数，整型，不能超过2000（非必录）
    }

    /// <summary>
    /// 作废接口参数
    /// </summary>
    public struct RequestCancel
    {
        public long CreateOrgId;    // 创建者组织内码，字符串类型（非必录）
        public JArray Numbers;      // 单据编码集合，数组类型，格式：[No1,No2,...]（使用编码时必录）
        public string Ids;          // 单据内码集合，字符串类型，格式："Id1,Id2,..."（使用内码时必录）
        public JArray PkEntryIds;   // 单据内码与分录内码对应关系的集合，字符串类型，格式：[{"Id":"Id1","EntryIds":"EntryId1,EntryId2,..."}] (使用分录状态转换时必录)
        public bool NetworkCtrl;    // 是否启用网控，布尔类型，默认false（非必录）
    }

    /// <summary>
    /// 接口返回数据
    /// </summary>
    public struct ResponseData
    {
        public ResponseDataResult Result;
    }

    /// <summary>
    /// 返回数据结构
    /// </summary>
    public struct ResponseDataResult
    {
        public ResponseDataResultStatus ResponseStatus;
        public long ID;                     // 单据内码
        public string Number;               // 单据编号
        public JArray NeedReturnData;       // 返回结果的字段集合
    }

    /// <summary>
    /// 返回结果状态
    /// </summary>
    public struct ResponseDataResultStatus
    {
        public bool IsSuccess;          // 是否操作成功
        public long ErrorCode;
        public List<ResponseDataResultErrors> Errors;           // 失败错误信息
        public List<ResponseDataResultSuccessEntitys> SuccessEntitys;  // 操作成功的实体信息
        public List<ResponseDataResultSuccessMessages> SuccessMessages;  // 成功消息
        public long MsgCode;             // 消息代码
    }

    public struct ResponseDataResultErrors
    {
        public string FieldName;
        public string Message;
        public long DIndex;
    }

    public struct ResponseDataResultSuccessEntitys
    {
        public long Id;
        public string Number;
        public long DIndex;
    }

    public struct ResponseDataResultSuccessMessages
    {
        public string FieldName;
        public string Message;
        public long DIndex;
    }

    public struct ResponseDataResultConvertStatus
    {
        public bool IsSuccess;          // 是否操作成功
        public long ErrorCode;
        public List<ResponseDataResultErrors> Errors;           // 失败错误信息
        public List<ResponseDataResultSuccessEntitys> SuccessEntitys;  // 操作成功的实体信息
        public List<ResponseDataResultSuccessMessages> SuccessMessages;  // 成功消息
        public long MsgCode;             // 消息代码
    }
}
